// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0

global Glob {
    function g1() {}
    protected function g2() {}
    public function g3() {}

    function c() {
        g1();g2();g3();
    }
}

Comp := Rectangle {
//   ><warning{':=' to declare a component is deprecated. The new syntax declare components with 'component MyComponent {'. Read the documentation for more info}
    function f1() {}
    public function f2() {}
    protected function f3() {}

    function c() {
        f1();f2();f3();
    }
}

export Xxx := Rectangle {
//         ><warning{':=' to declare a component is deprecated. The new syntax declare components with 'component MyComponent {'. Read the documentation for more info}
    function foo(a: int) -> string { return a; }

    comp := Comp {}

    function bar() {
        foo(45, 45);
//      >         <error{The callback or function expects 1 arguments, but 2 are provided}

        foo.hello(45);
//          >   <error{Cannot access fields of a function}

        root.foo();
//      >        <error{The callback or function expects 1 arguments, but 0 are provided}

        root.foo.hello(45);
//               >   <error{Cannot access fields of a function}

        comp.f1();
//           ><error{The function 'f1' is private. Annotate it with 'public' to make it accessible from other components}
        comp.f2();

        comp.f3();
//           ><error{The function 'f3' is protected}

        notexist();
//      >      <error{Unknown unqualified identifier 'notexist'}
        comp.notexist(56, foo("fff"));
//           >      <error{Element 'Comp' does not have a property 'notexist'}
//                            >   <^error{Cannot convert string to int}
        45()()();
//      >  <error{The expression is not a function}
        (foo)(1);
//       > <error{Function must be called. Did you forgot the '()'?}

    }

    callback xx <=> foo;
//  >                  <error{Binding to callback 'xx' must bind to another callback}
}


export component DerComp inherits Comp {
    public function f4() {
        root.f1();
//           ><error{The function 'f1' is private. Annotate it with 'public' to make it accessible from other components}
        root.f2();
        root.f3();

        self.f1();
//           ><error{The function 'f1' is private. Annotate it with 'public' to make it accessible from other components}
        self.f2();
        self.f3();
    }
}

export component DerDerComp inherits DerComp {
    public function f5() {
        root.f1();
//           ><error{The function 'f1' is private. Annotate it with 'public' to make it accessible from other components}
        root.f2();
        root.f3();
//           ><error{The function 'f3' is protected}
        self.f1();
//           ><error{The function 'f1' is private. Annotate it with 'public' to make it accessible from other components}
        self.f2();
        self.f3();
//           ><error{The function 'f3' is protected}

        Glob.g1();
//           ><warning{The function 'g1' is private. Annotate it with 'public' to make it accessible from other components. Note: this used to be allowed in previous version, but this should be considered an error}
        Glob.g2();
//           ><error{The function 'g2' is protected}
        Glob.g3();
    }
}